再開可能なタスク
[scheduler.resumable_tasks]
タスクの実行を一時停止して後に再開するように通知する機能。
// <oneapi/tbb/task.h> ヘッダーで定義
using oneapi::tbb::task::suspend_point = /* implementation-defined */;
template < typename Func > void oneapi::tbb::task::suspend( Func );
void oneapi::tbb::task::resume( oneapi::tbb::task::suspend_point );
要件:
Func
タイプは、SuspendFunc 要件を満たしている必要があります。
実行中のタスクで呼び出された oneapi::tbb::task::suspend
関数は、タスクの実行を一時停止し、スレッドを切り替えて他の oneTBB 並列ワークに参加します。この関数は、現在の実行コンテキスト oneapi::tbb::task::suspend_point
を引数として持つユーザー呼び出し可能なオブジェクトを受け入れます。ユーザー指定の呼び出し可能オブジェクトは、呼び出し元のスレッドで実行されます。
oneapi::tbb::task::suspend_point
コンテキスト・タグを oneapi::tbb::task::resume
関数に渡して、中断されたポイントでプログラムの実行をトリガーする必要があります。oneapi::tbb::task::resume
関数は、アプリケーションの別スレッドの任意のポイントを呼び出すことができます。この関数は、タスク・スケジューラーのシグナルとして機能します。
注
oneapi::tbb::task::suspend
を呼び出したスレッドが、中断された後に実行を継続する保証はありません。だたし、これらの保証は、最も外側のブロックの oneTBB 呼び出し (oneapi::tbb::parallel_for
や oneapi::tbb::flow::graph::wait_for_all
) および oneapi::tbb::task_arena::execute
呼び出しに適用されます。
例
// 並列計算領域
oneapi::tbb::parallel_for(0, N, [&](int) {
// 現在のタスクの実行を停止し、コンテキストを取得します
oneapi::tbb::task::suspend([&] (oneapi::tbb::task::suspend_point tag) {
// 非同期要求を処理する専用のユーザー管理アクティビティー。
async_activity.submit(tag); // OpenCL/IO/データベース/ネットワークなどの可能性があります。
}); // この関数の後に実行が再開されます
});
// 専用ユーザー管理アクティビティー:
// 専用のユーザー管理アクティビティーから、
// oneapi::tbb::task::suspend_point によって参照されるタスクの実行を再開するシグナル
oneapi::tbb::task::resume(tag);